/* This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/
/**
 * Clase con metodos auxiliares que permite obtener datos a traves de scripts incorporados
 *
 * */
package Controlador;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.StringTokenizer;
import java.util.Vector;

/**
 * Clase auxiliar
 * @author admin
 */
public class Tools {

    /**
     * Devuelve el numero de serie del disco pasado por parametro.
     * @param unidad Unidad de disco de la que se quiere averiguar el numero de serie
     * @return Numero de serie del disco
     */
    public static String getSerialVolumeWindows(String unidad) {
        String Serial = "";
        try {
            String linea;

            Process p = Runtime.getRuntime().exec("vol.bat " + unidad.subSequence(0, unidad.length() - 1));
            BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
            while ((linea = input.readLine()) != null) {
                linea = linea.toLowerCase();              
                if (linea.contains("serial") || linea.contains("serie")) {
                    Serial = linea;
                }
            }
            input.close();
        } catch (Exception err) {
            err.printStackTrace();
        }
        return Serial;
    }

    /**
     * Devuelve el numero de serie del disco pasado por parametro en Linux
     * @param unidad Unidad de disco de la que se quiere averiguar el numero de serie
     * @return Numero de serie del disco
     */
    public static String getSerialVolumeLinux(String unidad) {
        String Serial = "";
        String disp = "";
        try {
            String linea;
//hdparm -i /dev/sda1 | grep Serial
            File f = new File("searchfs.sh");
            Process p = Runtime.getRuntime().exec(f.getAbsolutePath());
            BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
            while ((linea = input.readLine()) != null) {
                String[] campos = linea.split("\\s+");
                if (campos[5].compareTo(unidad) == 0) {
                    disp = campos[0];                   
                }
            }
            input.close();

            f = new File("hdparm.sh");
            p = null;
            p = Runtime.getRuntime().exec((f.getAbsolutePath() + " " + disp));
            input = new BufferedReader(new InputStreamReader(p.getInputStream()));
            while ((linea = input.readLine()) != null) {

                Serial = linea;             
            }
            input.close();



        } catch (Exception err) {
            //err.printStackTrace();
        }
        return Serial;
    }

    /**
     * Metodo que permite obtener el conjuntod e unidades que tiene montados en linux
     * @return Vector con el conjunto de unidades montadas en el sistema operativo linux
     */
    public static String[] obtenerUnidadesLinux() {
        Vector uni = new Vector();
        String[] unidades;
        int contador = 0;
        try {
            String linea;
            File f = new File("searchfs.sh");
            Process p = Runtime.getRuntime().exec(f.getAbsolutePath());
            BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
            while ((linea = input.readLine()) != null) {
                String[] campos = linea.split("\\s+");
                uni.add(campos[5]);
                contador++;
            }
            input.close();
        } catch (Exception err) {
            err.printStackTrace();
        }
        unidades = new String[contador];
        Iterator i = uni.iterator();
        int j = 0;
        while (i.hasNext()) {
            unidades[j] = (String) i.next();
            j++;
        }

        return unidades;
    }

    /**
     * Metodo que permite obtener el conjuntod e unidades que tiene montados en linux
     * @return Vector con el conjunto de unidades montadas en el sistema operativo linux
     */
    public static String[] obtenerUnidadesWindows() {
        String[] unidades;
        File[] raices;
        raices = File.listRoots();
        unidades = new String[raices.length];
        for (int i = 0; i < raices.length; i++) {
            unidades[i] = raices[i].toString();
        }
        return unidades;
    }

    public static void addLogLine(String line) {
        FileWriter fichero = null;
        PrintWriter pw = null;
        try {
            fichero = new FileWriter(Constantes.getLogFile(), true);
            pw = new PrintWriter(fichero);
            pw.println(line);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // Nuevamente aprovechamos el finally para
            // asegurarnos que se cierra el fichero.
            if (null != fichero) {
                try {
                    fichero.close();

                } catch (Exception e2) {
                    e2.printStackTrace();
                }
            }
        }
    }

    public static String reemplazarVEntorno(String path) {
        int start = -1;
        int end = -1;
        String replace = "";
        String salida = path;
        if (System.getProperties().getProperty("os.name").startsWith("Windows") || System.getProperties().getProperty("os.name").startsWith("Microsoft")) {
            for (int i = 0; i < path.length(); i++) {
                if (path.charAt(i) == '%') {
                    if (start == -1) {
                        start = i;
                    } else {
                        end = i;
                        replace = path.substring(start, end + 1);

                        if (!replace.contains("/") && !replace.contains("\\")) {
                            replace = replace.replace("%", "");

                            //path.replace(replace, System.getProperty(replace));
                            String reemplazo=System.getenv(replace);
                            //Se quita el C: de la cadena, para que quede una ruta sin definir la unidad
                            if(reemplazo.charAt(1)==':'){
                                reemplazo=reemplazo.substring(3);
                            }
                            salida = path.replace("%" + replace + "%", reemplazo);
                            
                        }
                        
                    }
                }
            }
            //Cambiamos todas las cosas raras
                            salida = salida.replace("\\/","/");
                            salida = salida.replace("/\\","/");
                            salida = salida.replace("\\\\","\\");
                            salida = salida.replace("//","/");
                            if(salida.charAt(0)=='/' || salida.charAt(0)=='\\'){
                               salida=salida.substring(1);
                            }
                           salida = salida.replace("/","\\");
        }
        return salida;
    }
}
